﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.IO;
using Custom;

namespace BizkaibusMobilePro
{
    public partial class frmMain : Form
    {

        Dictionary<int, string> _municipios;
        Dictionary<string, XmlNode> _paradas;
        Dictionary<string, Dictionary<string,XmlNode>> _municipiosParadas;
        XmlDocument _favoritos;
        string _favoritosPath;
        bizbus.TQ service;

        public frmMain()
        {
            InitializeComponent();
        }

        private void menuItem4_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void frmMain_Load(object sender, EventArgs e)
        {
            this.Show();
            if (!LoadConfig())
            {
                menuItem4_Click(null, null);
            }
        }

        private void LoadFavorites(bool reload)
        {
            treeFavoritos.Nodes[0].Nodes.Clear();
            treeFavoritos.Nodes[1].Nodes.Clear();

            string dataPath = helper.ApplicationCombinedPath("data");
            _favoritosPath = helper.ApplicationCombinedPath("data", "favoritos.xml");

            try
            {
                if (!reload)
                {
                    helper.FormDisable(this, "Cargando favoritos...");
                    _favoritos = helper.XmlGetDocument(_favoritosPath);
                }
                else
                {
                    helper.FormDisable(this, "Actualizando favoritos...");
                    _favoritos.Save(_favoritosPath);
                }

                TreeNode nuevoFavorito;


                foreach (XmlNode linea in _favoritos.SelectNodes("//lineas/Registro"))
                {
                    nuevoFavorito = new TreeNode();
                    nuevoFavorito.Text = string.Format("Linea:[{0}] Sentido: {1}", (linea.Attributes["LN_CLINEA"].Value == "*" ? "Todas" : linea.Attributes["LN_CLINEA"].Value), (linea.Attributes["IR_SENTDO"].Value.ToUpper() == "I" ? "Ida" : "Vuelta"));
                    nuevoFavorito.Tag = linea;
                    treeFavoritos.Nodes[0].Nodes.Add(nuevoFavorito);
                }

                XmlNode tmpParada;
                foreach (XmlNode linea in _favoritos.SelectNodes("//paradas/parada"))
                {
                    nuevoFavorito = new TreeNode();

                    tmpParada = _paradas[linea.Attributes["ssid"].Value];

                    nuevoFavorito.Text = string.Format("Linea:[{0}] Municipio: {1} Parada: {2}", (linea.Attributes["linea"].Value == "*" ? "Todas" : linea.Attributes["linea"].Value), tmpParada.Attributes["DescripcionMunicipio"].Value, tmpParada.Attributes["DENOMINACION"].Value);
                    nuevoFavorito.Tag = linea;
                    treeFavoritos.Nodes[1].Nodes.Add(nuevoFavorito);
                }

            }
            catch (Exception ex)
            {
            }
            finally
            {
                helper.FormEnable(this);
            }

        }

        private bool LoadConfig()
        {
            string dataPath = helper.ApplicationCombinedPath("data");
            string _municipiosPath = helper.ApplicationCombinedPath("data", "municipios.xml");

            try
            {
                service = new BizkaibusMobilePro.bizbus.TQ();
                //service.gfINIT();

                _municipios = new Dictionary<int, string>();
                XmlDocument doc = helper.XmlGetDocument(_municipiosPath);
                int id = 0;
                string nombre = "";
                KeyValuePair<int, string> keyvalue;

                cmbOrigen.Items.Clear();
                cmbDestino.Items.Clear();

                helper.FormDisable(this, "Cargando configuracion...");

                foreach (XmlNode municipio in doc.SelectNodes("//Registro"))
                {
                    id = int.Parse(municipio.Attributes["CodigoMunicipio"].Value);
                    nombre = municipio.Attributes["DescripcionMunicipio"].Value;
                    _municipios.Add(id, nombre);

                    keyvalue = new KeyValuePair<int, string>(id, nombre);

                    cmbOrigen.Items.Add(keyvalue);
                    cmbDestino.Items.Add(keyvalue);
                }

                _paradas = new Dictionary<string, XmlNode>();
                _municipiosParadas = new Dictionary<string, Dictionary<string, XmlNode>>();
                string _paradasPath = helper.ApplicationCombinedPath("data", "aparadas.xml");

                doc = helper.XmlGetDocument(_paradasPath);
                
                string sid = "";


                foreach (XmlNode parada in doc.SelectNodes("//Registro"))
                {
                    try
                    {
                        if (!_municipiosParadas.ContainsKey(parada.Attributes["DescripcionMunicipio"].Value))
                        {
                            _municipiosParadas.Add(parada.Attributes["DescripcionMunicipio"].Value, new Dictionary<string, XmlNode>());
                        }

                        sid = parada.Attributes["PROVINCIA"].Value + parada.Attributes["MUNICIPIO"].Value + parada.Attributes["PARADA"].Value;
                        _paradas.Add(sid, parada);
                        _municipiosParadas[parada.Attributes["DescripcionMunicipio"].Value].Add(sid, parada);
                    }
                    catch (Exception ex)
                    {
                        string err = parada.Attributes["MUNICIPIO"].Value;
                        MessageBox.Show(err);
                    }
                }

                foreach (string municipio in _municipiosParadas.Keys)
                {
                    cmbMunicipios.Items.Add(municipio);
                }

                LoadFavorites(false);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                return false;
            }
            finally
            {
                helper.FormEnable(this);
            }
            return true;
        }

        private void btnBuscarOrigen_Click(object sender, EventArgs e)
        {
            if(cmbOrigen.SelectedItem==null || cmbDestino.SelectedItem==null)
            {
                MessageBox.Show("Seleccione ORIGEN y DESTINO para buscar las lineas de autobuses que coinciden con su criterio.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                return;
            }
            string codOrigen = "",codDestino = "";
            string descOrigen ="",descDestino = "";

            codOrigen = ((KeyValuePair<int,string>)cmbOrigen.SelectedItem).Key.ToString().PadLeft(3,'0');
            codDestino = ((KeyValuePair<int,string>)cmbDestino.SelectedItem).Key.ToString().PadLeft(3,'0');
            descOrigen = ((KeyValuePair<int,string>)cmbOrigen.SelectedItem).Value;
            descDestino = ((KeyValuePair<int,string>)cmbDestino.SelectedItem).Value;

            string lineasResultado = "";
            try
            {
                helper.FormDisable(this, "Buscando rutas...");
                lineasResultado = service.gfExistenTransbordos(0, "", "", "48", codOrigen, descOrigen, "", "", "48", codDestino, descDestino);
            }
            catch
            {
                MessageBox.Show("No se ha encontrado ninguna ruta.", "Error");
                return;
            }
            finally
            {
                helper.FormEnable(this);
            }


            string[] datos = lineasResultado.Split('®');
            string lineas = datos[datos.GetUpperBound(0)];

            XmlDocument docLineas = new XmlDocument();
            docLineas.LoadXml(lineas);

            ListViewItem newItem;

            lstLineasA.Items.Clear();
            mnuDetalle.Enabled = false;

            try
            {
                helper.FormDisable(this, "Cargando rutas...");
                foreach (XmlNode linea in docLineas.SelectNodes("//Registro"))
                {
                    newItem = new ListViewItem();
                    newItem.Text = linea.Attributes["LN_CLINEA"].Value;
                    newItem.SubItems.Add((linea.Attributes["IR_SENTDO"].Value.ToUpper() == "I" ? "Ida" : "Vuelta"));
                    newItem.SubItems.Add(linea.Attributes["RL_DENOMI"].Value);
                    newItem.Tag = linea;
                    lstLineasA.Items.Add(newItem);
                }
            }
            catch
            {
                MessageBox.Show("Error cargando rutas, formato de datos inesperado.", "Error");
                return;
            }
            finally
            {
                helper.FormEnable(this);
            }

            helper.ColumnsAutoSize(lstLineasA.Columns);
        }

        private void lstLineas_ItemActivate(object sender, EventArgs e)
        {
            mnuDetalle.Enabled = true;
        }

        private void mnuDetalle_Click(object sender, EventArgs e)
        {
            frmDetalleLinea detalle;
            frmProximasLlegadas llegadas;
            switch (tabCtlBusquedas.SelectedIndex)
            {
                case 0:
                    if (treeFavoritos.SelectedNode.Parent.Tag.ToString().ToUpper() == "L")
                    {
                        detalle = new frmDetalleLinea();
                        detalle.ShowDetail((XmlNode)treeFavoritos.SelectedNode.Tag, _paradas, _favoritos);
                    }
                    else
                    {
                        llegadas = new frmProximasLlegadas();
                        XmlNode parada = (XmlNode)treeFavoritos.SelectedNode.Tag;
                        llegadas.ShowDetail(parada.Attributes["linea"].Value, parada.Attributes["ssid"].Value,_favoritos);
                    }
                    _favoritos.Save(_favoritosPath);
                    LoadFavorites(true);
                    break;
                case 1:
                case 2:
                    ListView target;
                    target = (tabCtlBusquedas.SelectedIndex == 1 ? lstLineasA : lstLineasB);
                    if (target.FocusedItem != null)
                    {
                        detalle = new frmDetalleLinea();
                        detalle.ShowDetail((XmlNode)target.FocusedItem.Tag, _paradas, _favoritos);
                        _favoritos.Save(_favoritosPath);
                        LoadFavorites(true);
                    }
                    else
                    {
                        mnuDetalle.Enabled = false;
                    }
                    break;
                case 3:
                    if (cmbParadas.SelectedItem != null)
                    {
                        llegadas = new frmProximasLlegadas();
                        string[] secciones = cmbParadas.SelectedItem.ToString().Split('#');
                        llegadas.ShowDetail("*", secciones[secciones.GetUpperBound(0)].Trim(),_favoritos);
                        _favoritos.Save(_favoritosPath);
                        LoadFavorites(true);
                   }
                    else
                    {
                        MessageBox.Show("Selecciona una parada para ver la información de las lineas y llegadas.","Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    }
                    break;
                default:
                    break;
            }
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            string lineasResultado = "";

            try
            {
                helper.FormDisable(this, "Buscando lineas...");
                lineasResultado = service.gfReturn_Consultar_TBBB_Itinerario(1, "", "", "");
            }
            catch
            {
                MessageBox.Show("No se ha encontrado ninguna linea.", "Error");
                return;
            }
            finally
            {
                helper.FormEnable(this);
            }

            string[] datos = lineasResultado.Split('®');
            string lineas = datos[datos.GetUpperBound(0)];
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(lineas);

            try
            {
                helper.FormDisable(this, "Cargando lineas...");
                foreach (XmlNode linea in doc.SelectNodes("//Registro"))
                {
                    lstLineasDisponibles.Items.Add(linea.Attributes["IR_CLINEA"].Value);
                }
            }
            catch
            {
            }
            finally
            {
                helper.FormEnable(this);
            }
        }

        private void tabCtlBusquedas_SelectedIndexChanged(object sender, EventArgs e)
        {
            mnuDetalle.Enabled = false;
            btnCargarRutasPorLinea.Enabled = false;
        }

        private void lstLineasDisponibles_SelectedIndexChanged(object sender, EventArgs e)
        {
            btnCargarRutasPorLinea.Enabled = true;
        }

        private void btnCargarRutasPorLinea_Click(object sender, EventArgs e)
        {
            try
            {
                helper.FormDisable(this, "Cargando rutas de la linea...");
                string detalleLinea = service.gfReturn_LineasLineaWEB(lstLineasDisponibles.SelectedItem.ToString(), "");
                string[] datos = detalleLinea.Split('®');
                string xmlLinea = datos[datos.GetUpperBound(0)];

                XmlDocument docLineas = new XmlDocument();
                docLineas.LoadXml(xmlLinea);

                ListViewItem newItem;

                lstLineasB.Items.Clear();
                mnuDetalle.Enabled = false;
                XmlAttribute att = null;

                foreach (XmlNode linea in docLineas.SelectNodes("//Registro"))
                {
                    att = linea.OwnerDocument.CreateAttribute("RL_DENOMI");
                    att.Value = linea.Attributes["LN_DENOMI"].Value;
                    linea.Attributes.Append(att);

                    newItem = new ListViewItem();
                    newItem.Text = linea.Attributes["LN_CLINEA"].Value;
                    newItem.SubItems.Add((linea.Attributes["IR_SENTDO"].Value.ToUpper() == "I" ? "Ida" : "Vuelta"));
                    newItem.SubItems.Add(linea.Attributes["RL_DENOMI"].Value);
                    newItem.Tag = linea;
                    lstLineasB.Items.Add(newItem);
                }
            }
            catch
            {
                MessageBox.Show("Error cargando las rutas de la linea", "Error");
                return;
            }
            finally
            {
                helper.FormEnable(this);
            }
            helper.ColumnsAutoSize(lstLineasB.Columns);
        }

        private void lst_SelectedIndexChanged(object sender, EventArgs e)
        {
        }

        private void cmbMunicipios_SelectedIndexChanged(object sender, EventArgs e)
        {
            cmbParadas.Items.Clear();
            foreach (KeyValuePair<string,XmlNode> parada in _municipiosParadas[cmbMunicipios.SelectedItem.ToString()])
            {
                cmbParadas.Items.Add(string.Format("{1} # {0}", parada.Key, parada.Value.Attributes["DENOMINACION"].Value));
            }
        }

        private void cmbParadas_SelectedIndexChanged(object sender, EventArgs e)
        {
            mnuDetalle.Enabled = cmbParadas.SelectedItem != null;
        }

        private void treeFavoritos_AfterSelect(object sender, TreeViewEventArgs e)
        {
            bool enableMenu = (treeFavoritos.SelectedNode != null && treeFavoritos.SelectedNode.Parent != null);
            contextVerDetalle.Enabled = enableMenu;
            contextEliminarFavorito.Enabled = enableMenu;
            mnuDetalle.Enabled = enableMenu;
        }

        private void contextVerDetalle_Click(object sender, EventArgs e)
        {
            mnuDetalle_Click(null, null);
        }

        private void contextEliminarFavorito_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Eliminar de tus favoritos?", "Favoritos", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
            {
                TreeNode eliminar = treeFavoritos.SelectedNode;
                XmlNode _favLinea = (XmlNode)eliminar.Tag;
                if (eliminar.Parent.Tag.ToString().ToUpper() == "L") //L = Linea
                {
                    _favoritos.DocumentElement.SelectSingleNode("//lineas").RemoveChild(_favoritos.SelectSingleNode("//lineas/Registro[@LN_CLINEA='" + _favLinea.Attributes["LN_CLINEA"].Value + "'][@IR_NMRORU='" + _favLinea.Attributes["IR_NMRORU"].Value + "']"));
                    treeFavoritos.Nodes[0].Nodes.Remove(eliminar);// 0 = Nodo Padre de Lineas
                }
                else //P = Parada
                {
                    _favoritos.DocumentElement.SelectSingleNode("//paradas").RemoveChild(_favoritos.SelectSingleNode("//paradas/parada[@linea='"+_favLinea.Attributes["linea"].Value+"'][@ssid='"+_favLinea.Attributes["ssid"].Value+"']"));
                    treeFavoritos.Nodes[1].Nodes.Remove(eliminar);// 0 = Nodo Padre de Lineas*/
                }
                _favoritos.Save(_favoritosPath);
            }
        }
    }
}